package com.yfs.cloud.controller;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.github.pagehelper.PageInfo;
import com.yfs.cloud.authority.UserAuthority;
import com.yfs.cloud.commons.Constants;
import com.yfs.cloud.commons.Like;
import com.yfs.cloud.commons.Query;
import com.yfs.cloud.entity.User;
import com.yfs.cloud.service.UserService;
import com.yfs.cloud.vo.UserVO;

import io.swagger.annotations.ApiOperation;

/**
* @Company: 影法師工作室
* @Description: 用户控制器 
* @author 影法師  
* @date 2020年8月25日 上午7:09:40 
* @version V1.0
 */
@RestController
@RequestMapping("/user")
public class UserController {

	@Autowired
	private UserService userService;

	/**
	* @Description: 根据用户id封装此用户的角色和权限数据 , 这里使用 @RequestParam 而不是 @PathVariable 完全是 feign 的坑
	* @author 影法師 
	* @date 2020年8月25日 下午9:09:47 
	* @version V1.0 
	* @param @param id
	* @param @return    
	* @return UserAuthority    
	* @throws
	 */
	@GetMapping(value = "/findUserAuthority")
	public UserAuthority findUserAuthority(@RequestParam("id") Long id) {
		return userService.findUserAuthority(id);
	}

	@PostMapping(value = "/findOne")
	@ApiOperation("条件查询唯一用户")
	public User findOne(@RequestBody UserVO userVO) throws Exception {
		// 注意, 这里没有设置密码, 这是因为我几乎没有遇到过根据用户密码来查询用户这种业务场景的, 这里 LoginController
		// 中也只是根据用户的账户来查询, 所以这里几乎可以肯定传入的 userVO 中 password 字段一定是空字符串, 下面几个 find
		// 方法不需要加也是同样的道理, 其实只有创建用户的场景才需要设置加密密码, 其他是没有场景的
		return userService.findOne(userVO);
	}

	@PostMapping(value = "/findList")
	@ApiOperation("条件查询用户列表")
	public List<User> findList(@RequestBody Query<User> query) throws Exception {
		return userService.findList(query.getQuery(), query.getSorts(), query.getLikes());
	}

	@PostMapping(value = "/findPage")
	@ApiOperation("条件分页查询用户")
	public PageInfo<User> findPage(@RequestBody Query<User> query) throws Exception {
		return userService.findPage(query.getQuery(), query.getPageNum(), query.getPageSize(), query.getSorts(),
				query.getLikes());
	}

	@PostMapping(value = "/findPageUserByRoleIdAndWxNickname")
	@ApiOperation("根据角色id和微信昵称模糊分页查询所有用户的账号+微信昵称+性别+角色名称")
	public PageInfo<Map<String, String>> findPageUserByRoleIdAndWxNickname(@RequestBody Query<UserVO> query) {
		Map<String, Object> params = new HashMap<>();
		params.put(Constants.PAGE_NUM, query.getPageNum());
		params.put(Constants.PAGE_SIZE, query.getPageSize());
		params.put("roleId", query.getQuery().getRoleId());
		params.put("wxN", Like.wrap(query.getLikes()[0].getLikePropertyValue()));
		return userService.findPageUserByRoleIdAndWxNickname(params);
	}

	@PostMapping(value = "/findOneById/{id}")
	@ApiOperation("根据id查询唯一用户")
	public User findOneById(@PathVariable("id") Long id) throws Exception {
		return userService.findOneById(id);
	}

	@PostMapping(value = "findListByRoleIds")
	@ApiOperation("根据角色id列表查询用户列表")
	public List<User> findListByRoleIds(@RequestBody UserVO userVO) throws Exception {
		Map<String, Object> params = new HashMap<>();
		params.put("id", userVO.getId());
		params.put("roleIds", Arrays.asList(userVO.getRoleIds()));
		return userService.findListByRoleIds(params); // 这个请求要看效果的话, 要去看日志中打印的sql
	}
}
